#ifndef __DEBUG_H__
#define __DEBUG_H__

#include <stdio.h>
#include <assert.h>

extern FILE* log_fp;

#ifdef LOG_FILE
#	define Log_write(format, ...) fprintf(log_fp, format, ## __VA_ARGS__), fflush(log_fp)
#else
#	define Log_write(format, ...)
#endif

// 这是一个用于打印日志信息的宏。它会将日志信息同时输出到标准输出和日志文件中。
// 日志信息包括文件名、行号、函数名等，以便更好地追踪问题
#define Log(format, ...) \
	do { \
		fprintf(stdout, "\33[1;34m[%s,%d,%s] " format "\33[0m\n", \
				__FILE__, __LINE__, __func__, ## __VA_ARGS__); \
		fflush(stdout); \
		Log_write("[%s,%d,%s] " format "\n", \
				__FILE__, __LINE__, __func__, ## __VA_ARGS__); \
	} while(0)

// 这是一个断言宏，用于在特定条件不满足时触发断言。如果条件 cond 为假，将会输出错误信息，
// 并调用 assert 函数终止程序执行
#define Assert(cond, ...) \
	do { \
		if(!(cond)) { \
			fflush(stdout); \
			fprintf(stderr, "\33[1;31m"); \
			fprintf(stderr, __VA_ARGS__); \
			fprintf(stderr, "\33[0m\n"); \
			assert(cond); \
		} \
	} while(0)

// 这是一个宏，用于在发生严重错误时终止程序执行。
// 它与 Assert 宏不同，不需要满足特定条件，而是直接触发程序终止。
#define panic(format, ...) \
	Assert(0, format, ## __VA_ARGS__)

#endif
